/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package progweb.project.Servlet;

import java.io.IOException;
import java.sql.Timestamp;
import java.util.ArrayList;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import progweb.project.Manager.DBManager;
import progweb.project.Manager.Medico;
import progweb.project.Manager.PDFWriter;
import progweb.project.Manager.Paziente;
import org.apache.log4j.*;

/**
 * Filtro che, in caso di conferma dei richiami, crea i pdf e memorizza i richiami nel DB
 * @author Valentino Briani
 */
public class MedicoEseguiRichiamiFilter implements Filter {
    private static org.apache.log4j.Logger log=Logger.getLogger(MedicoEseguiRichiamiFilter.class);
    private FilterConfig filterConfig = null;    
    HttpSession sessione;
    Medico m;
    String type;
    ArrayList<Paziente> pazienti;
    Timestamp data;

    /**
     *
     * @param request The servlet request we are processing
     * @param response The servlet response we are creating
     * @param chain The filter chain we are processing
     *
     * @exception IOException if an input/output error occurs
     * @exception ServletException if a servlet error occurs
     */
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        
        //Recupero del parametro "richiama", presente in caso di conferma dei richiami dalla servlet MedicoRichiamoPazientiConfermaSL
        log.info("Recupero del parametro \"richiama\"");
        String richiama=request.getParameter("richiama");
        log.debug("richiama = "+richiama);
        
        //Richiami confermati
        if (richiama!=null && richiama.equals("Conferma")) {
            log.info("Richiami confermati");
            
            //Recupero del medico, dei pazienti e della data dalla sessione
            log.info("Recupero attributi dalla sessione");
            HttpServletRequest r=(HttpServletRequest)request;
            this.sessione=r.getSession();
            this.m=(Medico)sessione.getAttribute("user");
            this.type=(String)this.sessione.getAttribute("type");
            this.pazienti=(ArrayList<Paziente>)sessione.getAttribute("pazienti");
            this.data=(Timestamp)sessione.getAttribute("data");
            
            //Controllo dei dati della sessione
            log.info("Controllo degli attributi");
            if(this.m==null || this.type.equals("paziente")){
                log.warn("Sessione inesistente o sceduta");
                request.setAttribute("error", "Sessione inesistente o scaduta.");
                request.setAttribute("page", "index.html");
                this.sessione.invalidate();
                RequestDispatcher rd=request.getRequestDispatcher("/ErrorServlet");
                rd.forward(request, response);
            }
            
            //Creazione del pdf e memorizzazione dei richiami nel DB
            log.info("Creazione pdf");
            PDFWriter.creaPDF(this.data, this.pazienti, this.m);
            log.info("Memorizzazione dei richiami nel DB");
            DBManager.addRichiamiToDB(this.data, this.pazienti, this.m);
            log.debug("Rimozione dell'attributo data dalla sessione");
            sessione.removeAttribute("data");
        }
        
        chain.doFilter(request, response);
    }
    
    /**
     * Return the filter configuration object for this filter.
     */
    public FilterConfig getFilterConfig() {
        return (this.filterConfig);
    }

    /**
     * Set the filter configuration object for this filter.
     *
     * @param filterConfig The filter configuration object
     */
    public void setFilterConfig(FilterConfig filterConfig) {
        this.filterConfig = filterConfig;
    }

    /**
     * Destroy method for this filter 
     */
    @Override
    public void destroy() {        
    }

    /**
     * Init method for this filter 
     */
    @Override
    public void init(FilterConfig filterConfig) {        
        this.filterConfig = filterConfig;
    }

    /**
     * Return a String representation of this object.
     */
    @Override
    public String toString() {
        if (filterConfig == null) {
            return ("MedicoEseguiRichiamiFilter()");
        }
        StringBuffer sb = new StringBuffer("MedicoEseguiRichiamiFilter(");
        sb.append(filterConfig);
        sb.append(")");
        return (sb.toString());
    }
    
}
